Locking Techniques হল ডেটাবেসে একাধিক ট্রানজেকশনের মধ্যে ডেটার নিরাপত্তা এবং এক্সক্লুসিভ অ্যাক্সেস নিশ্চিত করার প্রক্রিয়া। এই দুইটি প্রধান লকিং টেকনিক হল Optimistic Locking এবং Pessimistic Locking। এই দুটি টেকনিক ডেটার প্রতিযোগী অ্যাক্সেস বা "race conditions" নিয়ন্ত্রণ করতে ব্যবহৃত হয়, তবে এগুলির মধ্যে কিছু মৌলিক পার্থক্য রয়েছে।
Pessimistic Locking
Pessimistic Locking হল এমন একটি পদ্ধতি যেখানে একটি রেকর্ড যখন একটি ট্রানজেকশন দ্বারা এক্সেস করা হয়, তখন তা অন্য কোন ট্রানজেকশনের জন্য লক হয়ে থাকে। অর্থাৎ, ডেটা পরিবর্তন বা পড়ার আগে ট্রানজেকশনটি অন্য কোন ট্রানজেকশন দ্বারা প্রবেশ করতে পারে না, যতক্ষণ না প্রথম ট্রানজেকশন সম্পূর্ণ হয়।
বৈশিষ্ট্য:
- Immediate Locking: ডেটা এক্সেস করার সাথে সাথেই লক হয়ে যায়।
- High Safety: ডেটার সাথে একাধিক ট্রানজেকশনের সংঘর্ষের সম্ভাবনা কমে যায়।
- Performance Hit: লকিংয়ের কারণে পারফরমেন্স কিছুটা কমে যেতে পারে, কারণ একাধিক ট্রানজেকশন একে অপরকে অপেক্ষা করতে হয়।
উদাহরণ:
যদি দুটি ইউজার একই সময়ে একটি Employee রেকর্ড আপডেট করতে চায়, তবে Pessimistic Locking নিশ্চিত করবে যে এক ইউজার যখন রেকর্ডটি আপডেট করছে, তখন অন্য ইউজার সেই রেকর্ডে অ্যাক্সেস করতে পারবে না।
NHibernate-এ Pessimistic Locking কনফিগারেশন:
using NHibernate;
using NHibernate.Criterion;
ISession session = sessionFactory.OpenSession();
using (ITransaction transaction = session.BeginTransaction())
{
var employee = session.CreateCriteria<Employee>()
.Add(Restrictions.IdEq(1))
.SetLockMode(LockMode.PessimisticWrite) // Locking the record for write
.UniqueResult<Employee>();
employee.Name = "New Name"; // Update operation
session.Update(employee);
transaction.Commit();
}
এখানে:
- LockMode.PessimisticWrite: এই লকিং মোডটি ডেটার ওপর এক্সক্লুসিভ লক প্রয়োগ করে, যাতে অন্য ট্রানজেকশন ঐ রেকর্ডটিতে পরিবর্তন করতে না পারে।
Optimistic Locking
Optimistic Locking এমন একটি পদ্ধতি যেখানে একটি রেকর্ড পরিবর্তনের আগে তার কোনো লকিং করা হয় না। পরিবর্তে, ডেটা পরিবর্তন করার সময় যদি ডেটার অবস্থা (যেমন টাইমস্ট্যাম্প বা ভার্সন নম্বর) পরিবর্তিত হয়ে থাকে, তবে তা বুঝতে পারলে ডেটা আপডেট করা হবে না। অর্থাৎ, এটি ধরে নেয় যে একাধিক ট্রানজেকশন একই রেকর্ডে প্রবেশ করার পরও কোনো সংঘর্ষ হবে না, তবে যদি সংঘর্ষ হয়, তখন তা ডিটেক্ট করা হয় এবং প্রয়োজনীয় পদক্ষেপ গ্রহণ করা হয়।
বৈশিষ্ট্য:
- No Immediate Locking: রেকর্ডে কোন লক করা হয় না যখন এটি পড়া হয়।
- Higher Concurrency: একাধিক ট্রানজেকশন একই রেকর্ডে অ্যাক্সেস করতে পারে, তবে কেবল একটিই সফল হবে।
- Lower Safety: সংঘর্ষ হলে আপডেট ব্যর্থ হতে পারে, তবে পারফরমেন্স ভালো থাকে কারণ কম লকিং হয়।
উদাহরণ:
ধরা যাক, একটি Employee রেকর্ডের সাথে একটি ভার্সন নম্বর যুক্ত রয়েছে। যদি একজন ইউজার রেকর্ডটি আপডেট করতে চায়, তবে সে বর্তমান ভার্সন নম্বরটি ব্যবহার করবে। যখন অন্য ইউজারও একই রেকর্ড আপডেট করার চেষ্টা করবে, তখন তাদের মধ্যে সংঘর্ষ হবে এবং দ্বিতীয় ইউজারের আপডেট ব্যর্থ হবে।
NHibernate-এ Optimistic Locking কনফিগারেশন:
public class Employee
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual int Version { get; set; } // Version for Optimistic Locking
}
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name);
Version(x => x.Version); // Mapping version column for Optimistic Locking
}
}
ISession session = sessionFactory.OpenSession();
using (ITransaction transaction = session.BeginTransaction())
{
var employee = session.Get<Employee>(1); // Fetch the employee record
employee.Name = "Updated Name"; // Modify the name
try
{
session.Update(employee); // Attempt to update the record
transaction.Commit();
}
catch (StaleObjectStateException ex) // Handle Optimistic Locking failure
{
Console.WriteLine("Concurrency conflict detected: " + ex.Message);
}
}
এখানে:
- Version(x => x.Version):
Versionপ্রপার্টি দ্বারা রেকর্ডের বর্তমান অবস্থার ভার্সন নির্ধারণ করা হয়। যখন কোনো ইউজার রেকর্ড আপডেট করতে যাবে, তখন তাদের ভার্সন নম্বর চেক করা হয়। যদি অন্য কোনো ট্রানজেকশন এর মধ্যে রেকর্ডটি আপডেট করে, তবে StaleObjectStateException ছুঁড়ে দেয়া হয়।
তুলনা: Optimistic এবং Pessimistic Locking
| ধরণ | Pessimistic Locking | Optimistic Locking |
|---|---|---|
| লকিং | ডেটা এক্সেস করার সময় লক প্রয়োগ করা হয়। | কোনো লকিং হয় না; পরিবর্তনের সময় ডেটা চেক করা হয়। |
| পারফরমেন্স | কম পারফরমেন্স, কারণ একাধিক ট্রানজেকশন অপেক্ষা করতে পারে। | উচ্চ পারফরমেন্স, কারণ একাধিক ট্রানজেকশন একসাথে কাজ করতে পারে। |
| এপ্লিকেশন ধরন | যেখানে ডেটা পরিবর্তন অত্যন্ত গুরুত্বপূর্ণ। | যেখানে একাধিক ইউজারের অ্যাক্সেস ও কাজ গুরুত্বপূর্ণ। |
| সেফটি | অধিক সেফটি, কারণ ডেটা এক্সক্লুসিভলি এক্সেস করা হয়। | সেফটি কম, কিন্তু কম লকিংয়ের কারণে অধিক পারফরমেন্স। |
এই দুটি পদ্ধতির মধ্যে সঠিকটি বেছে নেয়া আপনার অ্যাপ্লিকেশন এবং ডেটাবেসের পারফরমেন্স, সেফটি এবং স্কেলেবিলিটির উপর নির্ভর করে। Pessimistic Locking যেখানে একাধিক ট্রানজেকশনের মধ্যে সংঘর্ষ এড়াতে হবে, সেখানে বেশি উপকারী। অপরদিকে, Optimistic Locking সাধারণত উচ্চ পারফরমেন্সের জন্য ব্যবহৃত হয়, যেখানে ট্রানজেকশন সংখ্যা বেশি হলেও একাধিক ইউজারের জন্য তথ্যের সংঘর্ষ কম হয়।
Read more